package Text19;

import java.io.*;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
    //    第一行是一个正整数 T，表示一共有 T组数据。
//    每一组数据的第一行包含了两个用空格分开的正整数 R和 C，表示地图是一个 R×C 的矩阵。
//    接下来的 R行描述了地图的具体内容，每一行包含了 C个字符。
//    字符含义如题目描述中所述。保证有且仅有一个 S 和 E。
    static int N = 210, n, m;
    static char[][] p = new char[N][N];
    static int[][] st = new int[N][N];
    static int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};//四个方向

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int t = Integer.parseInt(br.readLine());
        while (t-- > 0) {
            String[] s = br.readLine().split(" ");
            n = Integer.parseInt(s[0]);
            m = Integer.parseInt(s[1]);
            for (int i = 0; i < n; i++) {
                p[i] = br.readLine().toCharArray();
            }
            PII start = null, end = null;
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if (p[i][j] == 'S') {
                        start = new PII(i, j);
                    }
                    if (p[i][j] == 'E') {
                        end = new PII(i, j);
                    }
                }
            }
            int res=bfs(start, end);
            if (res == -1) {
                bw.write("oop!"+"\n");
            } else {
                bw.write(res+"\n");
            }
        }
        bw.flush();
    }

    private static int bfs(PII start, PII end) {
        for (int i = 0; i < n; i++) {
            Arrays.fill(st[i], -1);
        }
        st[start.x][start.y] = 0;
        Queue<PII> queue = new LinkedList<>();
        queue.offer(start);
        while (!queue.isEmpty()) {
            PII tmp = queue.poll();
            for (int i = 0; i < 4; i++) {
                int x = tmp.x + dx[i];
                int y = tmp.y + dy[i];
                if (x < 0 || x >= n || y < 0 || y >= m) {
                    continue;
                }
                if (st[x][y] != -1) {
                    continue;
                }
                if (p[x][y] == '#') {
                    continue;
                }
                st[x][y] = st[tmp.x][tmp.y] + 1;
                if(end.x==x&&end.y==y){
                    return st[x][y];
                }
                queue.offer(new PII(x, y));
            }
        }
        return -1;
    }
}

class PII {
    int x, y;

    public PII(int x, int y) {
        this.x = x;
        this.y = y;
    }
}